Acceso a Bases de Datos [JDBC]

Ahora veremos como enviar la sentencia SELECT de la p�gina anterior desde un programa escrito en Java y como obtener los resultados que hemos mostrado.

JDBC devuelve los resultados en un objeto ResultSet, por eso necesitamos declarar un ejemplar de la clase ResultSet para contener los resultados. El siguiente c�digo presenta el objeto ResultSet: rs y le asigna el resultado de una consulta anterior.

ResultSet rs = stmt.executeQuery("SELECT COF_NAME, PRICE FROM COFFEES");

.�Utilizar el M�todo next

La variable rs, que es un ejemplar de ResultSet, contiene las filas de caf�s y sus precios mostrados en el juego de resultados de la p�gina anterior. Para acceder a los nombres y los precios, iremos a la fila y recuperaremos los valores de acuerdo con sus tipos. El m�todo next mueve algo llamado cursor a la siguiente fila y hace que esa fila (llamada fila actual) sea con la que podamos operar. Como el cursor inicialmente se posiciona justo encima de la primera fila de un objeto ResultSet, primero debemos llamar al m�todo next para mover el cursor a la primera fila y convertirla en la fila actual. Sucesivas invocaciones del m�todo next mover�n el cursor de l�nea en l�nea de arriba a abajo. Observa que con el JDBC 2.0, cubierto en la siguiente secci�n, se puede mover el cursor hacia atr�s, hacia posiciones espec�ficas y a posiciones relativas a la fila actual adem�s de mover el cursor hacia adelante.

.�Utilizar los m�todos getXXX

Los m�todos getXXX del tipo apropiado se utilizan para recuperar el valor de cada columna. Por ejemplo, la primera columna de cada fila de rs es COF_NAME, que almacena un valor del tipo VARCHAR de SQL. El m�todo para recuperar un valor VARCHAR es getString. La segunda columna de cada fila almacena un valor del tipo FLOAT de SQL, y el m�todo para recuperar valores de ese tipo es getFloat. El siguiente c�digo accede a los valores almacenados en la fila actual de rs e imprime una l�nea con el nombre seguido por tres espacios y el precio. Cada vez que se llama al m�todo next, la siguiente fila se convierte en la actual, y el bucle contin�a hasta que no haya m�s filas en rs.

String query = "SELECT COF_NAME, PRICE FROM COFFEES";
ResultSet rs = stmt.executeQuery(query);
		while (rs.next()) {
		String s = rs.getString("COF_NAME");
		Float n = rs.getFloat("PRICE");
		System.out.println(s + "   " + n);
}

La salida se parecer� a esto.

Colombian   7.99
French_Roast   8.99
Espresso   9.99
Colombian_Decaf   8.99
French_Roast_Decaf   9.99

Veamos c�mo funcionan los m�todos getXXX examinando las dos sentencias getXXX de este c�digo. Primero examinaremos getString.

String s = rs.getString("COF_NAME");

El m�todo getString es invocado sobre el objeto ResultSet: rs, por eso getString recuperar� (obtendr�) el valor almacenado en la columna COF_NAME de la fila actual de rs. El valor recuperado por getString se ha convertido desde un VARCHAR de SQL a un String de Java y se ha asignado al objeto String s. Observa que utilizamos la variable s en la expresi�n println mostrada arriba, de esta forma: println(s + " " + n)

La situaci�n es similar con el m�todo getFloat excepto en que recupera el valor almacenado en la columna PRICE, que es un FLOAT de SQL, y lo convierte a un float de Java antes de asignarlo a la variable n.

JDBC ofrece dos formas para identificar la columna de la que un m�todo getXXX obtiene un valor. Una forma es dar el nombre de la columna, como se ha hecho arriba. La segunda forma es dar el �ndice de la columna (el n�mero de columna), con un 1 significando la primera columna, un 2 para la segunda, etc. Si utiliz�ramos el n�mero de columna en vez del nombre de columna el c�digo anterior se podr�a parecer a esto.

String s = rs.getString(1);
float n = rs.getFloat(2);

La primera l�nea de c�digo obtiene el valor de la primera columna de la fila actual de rs (columna COF_NAME), convirti�ndolo a un objeto String de Java y asign�ndolo a s. La segunda l�nea de c�digo obtiene el valor de la segunda columna de la fila actual de rs, lo convierte a un float de Java y lo asigna a n. Recuerda que el n�mero de columna se refiere al n�mero de columna en la hoja de resultados no en la tabla original.

En suma, JDBC permite utilizar tanto el nombre c�mo el n�mero de la columna como argumento a un m�todo getXXX. Utilizar el n�mero de columna es un poco m�s eficiente, y hay algunos casos donde es necesario utilizarlo.

JDBC permite muchas lateralidades para utilizar los m�todos getXXX para obtener diferentes tipos de datos SQL. Por ejemplo, el m�todo getInt puede ser utilizado para recuperar cualquier tipo num�rico de caracteres. Los datos recuperados ser�n convertidos a un int; esto es, si el tipo SQL es VARCHAR, JDBC intentar� convertirlo en un entero. Se recomienda utilizar el m�todo getInt s�lo para recuperar INTEGER de SQL, sin embargo, no puede utilizarse con los tipos BINARY, VARBINARY, LONGVARBINARY, DATE, TIME, o TIMESTAMP de SQL.

M�todos para Recuperar Tipos SQL muestra qu� m�todos pueden utilizarse legalmente para recuperar tipos SQL, y m�s importante, qu� m�todos est�n recomendados para recuperar los distintos tipos SQL. Observa que esta tabla utiliza el t�rmino "JDBC type" en lugar de "SQL type." Ambos t�rminos se refieren a los tipos gen�ricos de SQL definidos en java.sql.Types, y ambos son intercambiables.

.�Utilizar el m�todo getString

Aunque el metodo getString est� recomendado para recuperar tipos CHAR y VARCHAR de SQL, es posible recuperar cualquier tipo b�sico SQL con �l. (Sin embargo, no se pueden recuperar los nuevos tipos de datoas del SQL3. Explicaremos el SQL3 m�s adelante).

Obtener un valor con getString puede ser muy �til, pero tiene sus limitaciones. Por ejemplo, si se est� utilizando para recuperar un tipo num�rico, getString lo convertir� en un String de Java, y el valor tendr� que ser convertido de nuevo a n�mero antes de poder operar con �l.

.�Utilizar los m�todos de ResultSet.getXXX para Recuperar tipos JDBC

TINYINT SMALLINT INTEGER BIGINT REAL FLOAT DOUBLE DECIMAL NUMERIC BIT CHAR
getByte X x x x x x x x x x x
getShort x X x x x x x x x x x
getInt x x X x x x x x x x x
getLong x x x X x x x x x x x
getFloat x x x x X x x x x x x
getDouble x x x x x X X x x x x
getBigDecimal x x x x x x x X X x x
getBoolean x x x x x x x x x X x
getString x x x x x x x x x x X
getBytes
getDate x
getTime x
getTimestamp x
getAsciiStream x
getUnicodeStream x
getBinaryStream
getObject x x x x x x x x x x x

LONGVARCHAR BINARY VARBINARY LONGVARBINARY DATE TIME TIMESTAMP VARCHAR
getByte x x
getShort x x
getInt x x
getLong x x
getFloat x x
getDouble x x
getBigDecimal x x
getBoolean x x
getString X x x x x x x x
getBytes X X x
getDate x x X x
getTime x x X x
getTimestamp x x x x X
getAsciiStream x X x x x
getUnicodeStream x X x x x
getBinaryStream x x X
getObject x x x x x x x x

Una "x" indica que el m�todo getXXX se puede utilizar legalmente para recuperar el tipo JDBC dado.

Una "X" indica que el m�todo getXXX est� recomendado para recuperar el tipo JDBC dado.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR